package com.vcg.vdam;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName TestBloomFilter
 * @Description https://www.cnblogs.com/rinack/p/9712477.html(布隆的简单理解)
 * https://www.cnblogs.com/luxianyu-s/p/12686466.html（深度理解下）
 * @Author yangxing02
 * @Date 2020/11/10 10:16
 * @Version 1.0
 */
//布隆为啥快；因为不存储数据；只是把数组改为1
public class TestBloomFilter {
    private static int size = 1000000;

    //默认误判率是0.03
//    private static BloomFilter<Integer> bloomFilter =BloomFilter.create(Funnels.integerFunnel(), size);
    //设置过滤器误判率是0.01
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size,0.01);

    //布隆过滤器：如果数组越长；误判率会更低；（其实可以理解为如果数组越长；散列到同一个数组下标的值可能性越小；
    // 那么判断相同值的可能性更大）

    //默认误判率是0.03；
    public static void main(String[] args) {
        for (int i = 0; i < size; i++) {
            bloomFilter.put(i);
        }

        List<Integer> list = new ArrayList<Integer>(1000);
        //故意取10000个不在过滤器里的值，看看有多少个会被认为在过滤器里
        for (int i = size + 10000; i < size + 20000; i++) {
            if (bloomFilter.mightContain(i)) {
                list.add(i);
            }
        }
        System.out.println("误判的数量：" + list.size());
    }
}
